package frsf.cidisi.exercise.tp.search.actions;


import componentes.Tesoro;
import frsf.cidisi.exercise.tp.search.*;
import frsf.cidisi.faia.agent.search.SearchAction;
import frsf.cidisi.faia.agent.search.SearchBasedAgentState;
import frsf.cidisi.faia.state.AgentState;
import frsf.cidisi.faia.state.EnvironmentState;

public class Tomar_tesoro extends SearchAction {

	final double multiplicador = 1000000;
	private double valorCosto=0;
    /**
     * This method updates a tree node state when the search process is running.
     * It does not updates the real world state.
     */
    @Override
    public SearchBasedAgentState execute(SearchBasedAgentState s) {
        Indiana_State indiana = (Indiana_State) s;
           
        Tesoro tesoro_aux; 
        if(indiana.getMapa().getAldea(indiana.getposicion().getNombre()).getTesoro().getValor_cofre()!=0  &&
        		(indiana.getpeso() + indiana.getMapa().getAldea(indiana.getposicion().getNombre()).getTesoro().getPeso_cofre()) <= 450){
   
        	tesoro_aux = new Tesoro();     
    		tesoro_aux.setContenido(0, 0, 0, 0, 0, 0, 0); 
    		
    	
        	valorCosto=  Truncar(multiplicador/indiana.getposicion().getTesoro().getValor_cofre(), 2);
        	indiana.setCosto(valorCosto);
        	
    		indiana.setpeso(indiana.getpeso()+indiana.getMapa().getAldea(indiana.getposicion().getNombre()).getTesoro().getPeso_cofre());
        	indiana.setvalor_acumulado(indiana.getvalor_acumulado() + indiana.getMapa().getAldea(indiana.getposicion().getNombre()).getTesoro().getValor_cofre());
        	indiana.getMapa().getAldea(indiana.getposicion().getNombre()).setTesoro(tesoro_aux);
        
        	
        
        	return indiana;
    	}
      
        return null;
    }

    /**
     * This method updates the agent state and the real world state.
     */
    @Override
    public EnvironmentState execute(AgentState ast, EnvironmentState est) {
        Isla_Emicere_State isla = (Isla_Emicere_State) est;
        //Indiana_State indiana = ((Indiana_State) ast);
        
        Tesoro tesoro_aux;
    
        if(isla.getpos_agente().getTesoro().getValor_cofre()!=0){
        	
            isla.ejecutarPirata();

	        tesoro_aux = new Tesoro();
	    	tesoro_aux.setContenido(0, 0, 0, 0, 0, 0, 0);
	     
	    	//para la interfaz
	    	String valor= String.valueOf(((Indiana_State) ast).getvalor_acumulado() + isla.getpos_agente().getTesoro().getValor_cofre());
	    	String peso= String.valueOf(((Indiana_State) ast).getpeso() + isla.getpos_agente().getTesoro().getPeso_cofre());
	    	Indiana_JonesMain.inter.tomarTesoro(peso,valor);
	    	
	    	((Indiana_State) ast).setpeso(((Indiana_State) ast).getpeso() + isla.getpos_agente().getTesoro().getPeso_cofre());
	    	((Indiana_State) ast).setvalor_acumulado(((Indiana_State) ast).getvalor_acumulado() + isla.getpos_agente().getTesoro().getValor_cofre());
	    	((Indiana_State) ast).getMapa().getAldea(((Indiana_State) ast).getposicion().getNombre()).setTesoro(tesoro_aux);
	    	     	
	    	
	    	isla.borrarTesoro(((Indiana_State) ast).getposicion());
	    	
	    	
        }
            
    	return isla;

    }

    /**
     * This method returns the action cost.
     */
    @Override
    public Double getCost() {
    	return  valorCosto;
    }

    /**
     * This method is not important for a search based agent, but is essensial
     * when creating a calculus based one.
     */
    @Override
    public String toString() {
        return "Tomar Tesoro";
    }
    
    
    public double Truncar(double nD, int nDec)
	{
      if(nD > 0)
	    nD = Math.floor(nD * Math.pow(10,nDec))/Math.pow(10,nDec);
	  else
	    nD = Math.ceil(nD * Math.pow(10,nDec))/Math.pow(10,nDec);

	  return nD;
	}
}